home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #1 / Amiga Plus CD - 1997 - No. 01.iso / pd / programmierung / proasm / routines / ports.r < prev    next >
Text File  |  1993-12-28  |  4KB  |  217 lines

  1.  
  2. ;---;  ports.r  ;--------------------------------------------------------------
  3. *
  4. *    ****    PORTS, SIGNAL AND MESSAGES HANDLING    ****
  5. *
  6. *    Author        Stefan Walter
  7. *    Version        1.05
  8. *    Last Revision    28.12.93
  9. *    Identifier    psm_defined
  10. *       Prefix        psm_    (ports, signals and messages)
  11. *                 ¯      ¯           ¯
  12. *    Functions    MakePort, UnMakePort
  13. *            SendReplyMSG, WaitAndGetMSG, ReplyMSG
  14. *
  15. *    Flags        psm_MESSAGES set 1 if MSG routines too.
  16. *
  17. ;------------------------------------------------------------------------------
  18.  
  19. ;------------------
  20.     ifnd    psm_defined
  21. psm_defined    =1
  22.  
  23. ;------------------
  24.  
  25.     include    "basicmac.r"
  26.  
  27. ;------------------------------------------------------------------------------
  28. *
  29. * MakePort    Open and init a port and allocate a signal bit. If port
  30. *        has a name, it goes to the public port list, else not.
  31. *
  32. * INPUT        a0    Port structure.
  33. *
  34. * RESULT    d0    Port structure or 0 if error.
  35. *        ccr    on d0.
  36. *
  37. ;------------------------------------------------------------------------------
  38.  
  39. ;------------------
  40. MakePort:
  41.  
  42. ;------------------
  43. ; Allocate a signal bit and add port.
  44. ;
  45. \alloc:
  46.     movem.l    d1-a6,-(sp)
  47.     move.l    a0,a4
  48.     move.l    4.w,a6
  49.     moveq    #-1,d0
  50.     jsr    -330(a6)        ;AllocSignal()
  51.     move.b    d0,15(a4)        ;signal bit...
  52.     bmi.s    \error
  53.  
  54.     moveq    #0,d1
  55.     bset    d0,d1
  56.     moveq    #0,d0
  57.     jsr    -306(a6)        ;SetSignals()
  58.  
  59.     move.l    $114(a6),16(a4)        ;set SigTask
  60.     lea    20(a4),a0
  61.     move.l    a0,(a0)            ;init message list
  62.     addq.l    #4,(a0)            ;
  63.     clr.l    4(a0)            ;
  64.     move.l    a0,8(a0)        ;
  65.  
  66.     tst.l    10(a4)
  67.     beq.s    \fine
  68.     move.l    a4,a1
  69.     jsr    -354(a6)        ;AddPort()
  70.  
  71. \fine:
  72.     move.l    a4,d0
  73.  
  74. \done:
  75.     tst.l    d0
  76.     movem.l    (sp)+,d1-a6
  77.     rts
  78.  
  79. \error:
  80.     moveq    #0,d0
  81.     bra.s    \done
  82.  
  83. ;------------------
  84.  
  85. ;------------------------------------------------------------------------------
  86. *
  87. * UnMakePort    Remove a port from the public port list and free the signal.
  88. *
  89. * INPUT        a0    Port structure.
  90. *
  91. ;------------------------------------------------------------------------------
  92.  
  93. ;------------------
  94. UnMakePort:
  95.  
  96. ;------------------
  97. ; Free port.
  98. ;
  99. \free:
  100.     movem.l    d0-a6,-(sp)
  101.     move.l    4.w,a6
  102.     move.l    a0,a4
  103.     move.l    a0,d0
  104.     beq.s    \done
  105.     moveq    #0,d0
  106.     move.b    15(a4),d0
  107.     jsr    -336(a6)        ;FreeSignal()
  108.     tst.l    10(a4)
  109.     beq.s    \done    
  110.     move.l    a4,a1
  111.     jsr    -360(a6)        ;RemPort()
  112.  
  113. \done:
  114.     movem.l    (sp)+,d0-a6
  115.     rts
  116.  
  117. ;------------------
  118.     ifd    psm_MESSAGES
  119.     NEED_    SendReplyMSG
  120.     NEED_    WaitAndGetMSG
  121.     NEED_    ReplyMSG
  122.     endif
  123.  
  124. ;------------------
  125.  
  126. ;------------------------------------------------------------------------------
  127. *
  128. * SendReplyMSG    Send a replyable message to a port.
  129. *
  130. * INPUT        a0    Destination port.
  131. *        a1    Message.
  132. *        a2    Reply port.
  133. *
  134. ;------------------------------------------------------------------------------
  135.     IFD    xxx_SendReplyMSG
  136. ;------------------
  137. SendReplyMSG:
  138.  
  139. ;------------------
  140. ; Send it.
  141. ;
  142. \send:
  143.     movem.l    d0-a6,-(sp)
  144.     move.l    a2,14(a1)
  145.     move.l    4.w,a6
  146.     jsr    -366(a6)        ;PutMSG()
  147.     movem.l    (sp)+,d0-a6
  148.     rts
  149.  
  150.     ENDC
  151. ;------------------
  152.  
  153. ;------------------------------------------------------------------------------
  154. *
  155. * WaitAndGetMSG    Wait for messages and get the first one.
  156. *
  157. * INPUT        a0    Port.
  158. *
  159. * RESULT    a0    Message.
  160. *
  161. ;------------------------------------------------------------------------------
  162.     IFD    xxx_WaitAndGetMSG
  163. ;------------------
  164. WaitAndGetMSG:
  165.  
  166. ;------------------
  167. ; Wait.
  168. ;
  169. \wait:
  170.     movem.l    d0-d7/a1-a6,-(sp)
  171.     move.l    a0,a5
  172.     move.l    4.w,a6
  173.     jsr    -384(a6)        ;WaitPort()
  174.     move.l    a5,a0
  175.     jsr    -372(a6)
  176.     move.l    d0,a0
  177.     movem.l    (sp)+,d0-d7/a1-a6
  178.     rts
  179.  
  180.     ENDC
  181. ;------------------
  182.  
  183. ;------------------------------------------------------------------------------
  184. *
  185. * ReplyMSG    Reply a message.
  186. *
  187. * INPUT        a0    Message.
  188. *
  189. ;------------------------------------------------------------------------------
  190.     IFD    xxx_ReplyMSG
  191. ;------------------
  192. ReplyMSG:
  193.  
  194. ;------------------
  195. ; Do it.
  196. ;
  197. \do:
  198.     movem.l    d0-a6,-(sp)
  199.     move.l    a0,a1
  200.     move.l    4.w,a6
  201.     jsr    -378(a6)        ;WaitPort()
  202.     movem.l    (sp)+,d0-a6
  203.     rts
  204.  
  205.     ENDC
  206. ;------------------
  207.     endif
  208.  
  209. ;------------------
  210.  
  211. ;--------------------------------------------------------------------
  212.  
  213. ;------------------
  214.  
  215.  end
  216.  
  217.